中间件
简介
中间件通常带有两个参数 (ctx, next)
ctx 是一个 Koa 的 Context
对象,该对象封装了一个传入的 http 消息,并对该消息进行了相应的响应。 ctx
通常用作上下文对象的参数名称。
通过 Context
对象可以访问到 response
对象和 request
对象。
Context
对象还提供了其 request
和 response
方法的快捷方式。例如可以使用 ctx.type
而不是 ctx.request.type
。
next
是调用执行下游中间件的函数,在代码执行完成后通过 then
方法返回一个 Promise
.
实现一个日志中间件
1 | // logger |
静态资源加载
koa-static中间件
1 | $ npm i koa-static |
新建目录 public 作为静态资源的文件夹
root > public > images - javascript - stylesheets
1 | const Koa = require('koa'); |
在 images 下放置图片,可通过 http://localhost:3000/images/demo.png
直接访问图片,不会被当成 get 请求处理
router
koa-router 中间件
1 | npm i koa-router |
将所有子路由抽离至一个主路由文件
routers > index.js
1 | const router = require('koa-router')() |
在子路由文件中向外导出规则
routers > demoRouter.js
1 | const router = require("koa-router")(); |
Controller
将请求过程抽离出一层控制层,简单的说 Controller 负责解析用户的输入,处理后返回相应的结果
Controller 层主要对用户的请求参数进行处理(校验、转换),然后调用对应的 service 方法处理业务,得到业务结果后封装并返回。
controller > demoController.js
1 | // 导入 service 层 |
Service
Service 就是在复杂业务场景下用于做业务逻辑封装的一个抽象层,提供这个抽象有以下几个好处:
- 保持 Controller 中的逻辑更加简洁。
- 保持业务逻辑的独立性,抽象出来的 Service 可以被多个 Controller 重复调用。
比如复杂数据的处理,比如要展现的信息需要从数据库获取,还要经过一定的规则计算,才能返回用户显示。或者计算完成后,更新到数据库。
service > demoService.js
在 service
层中读取文件(数据库)后返回数据给 controller
层
1 | const fs = require('fs'); |
MySQL
1 | $ npm i mysql |
基本使用
1 | const mysql = require('mysql') |
使用连接池
1 | const mysql = require('mysql') |
async/await封装使用mysql
由于mysql模块的操作都是异步操作,每次操作的结果都是在回调函数中执行,现在有了async/await,就可以用同步的写法去操作数据库
抽离相关配置
config.js
1 | const config = { |
封装 SQL 执行方法
utils > db.js
1 | const allConfig = require("../config") |
service
调用
1 | const query = require('../utils/db') |
cookie/session
cookie
koa提供了从上下文直接读取、写入cookie的方法
- ctx.cookies.get(name, [options]) 读取上下文请求中的cookie
- ctx.cookies.set(name, value, [options]) 在上下文中写入cookie
koa2 中操作的cookies是使用了npm的cookies模块,源码在https://github.com/pillarjs/cookies,所以在读写cookie的使用参数与该模块的使用一致。
1 | setCookies(ctx, next) { |
session
文件上传
busboy模块
busboy 是用来解析出请求中文件流
封装异步上传图片
utils > upload.js
1 | const inspect = require("util").inspect; |
调用
1 | async uploadFile(ctx,next) { |
其它中间件
koa-logger
1 | const koaLogger = require('koa-logger') |
koa-bodyparser
对于POST请求的处理,koa-bodyparser中间件可以把koa2上下文的formData数据解析到ctx.request.body中
1 | $ npm i koa-bodyparser |
app.js
1 | const bodyparser = require("koa-bodyparser"); |
使用
1 | ctx.request.body |
bodyparser 已经不包含 multipart/form-data 解析了,使用 multer 或 koa-body 一类,官方有中间件列表推荐的
待续